﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ASCalpuff.FileLayers
{

    /// <summary>
    /// 化学转化参数
    /// 包括臭氧观测资料、臭氧背景值、H2O2的浓度、氨的浓度及转化速率等变量
    public class PG11:Group
    {

        public PG11()
        {

            m_BCKO3 = new List<double>();
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);
            m_BCKO3.Add(80);


            m_BCKNH3 = new List<double>();

            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);

            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);

            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);
            m_BCKNH3.Add(10);


            m_BCKH2O2 = new List<double>();
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);
            m_BCKH2O2.Add(1);

            m_SOA = new SOAData();


        }




        /// <summary>
        /// 用于设置是否在化学转化模块中输入每小时臭氧数据的控制变量（(Used only if MCHEM = 1,3，4)）
        /// =0，使用一个每月臭氧背景浓度，常数
        /// =1，使用小时臭氧浓度文件
        /// </summary>
        int m_MOZ = 0;

        public int MOZ
        {
            get { return m_MOZ; }
            set { m_MOZ = value; }
        }


        /// <summary>
        ///每月臭氧背景浓度（只有在MCHEM=1,3 MOZ=0 或者 MOZ=1以及所有每小时的臭氧数据都缺少时使用），默认12*80
        /// 臭氧浓度，单位PPb，
        /// 定义每月臭氧浓度值，共12个
        /// </summary>
        List<double> m_BCKO3;

        public List<double> BCKO3
        {
            get { return m_BCKO3; }
            set { m_BCKO3 = value; }
        }



        /// <summary>
        /// 氨的背景浓度，单位ppb
        /// 定义每月氨的浓度值，共12个
        /// </summary>
        List<double> m_BCKNH3;

        public List<double> BCKNH3
        {
            get { return m_BCKNH3; }
            set { m_BCKNH3 = value; }
        }


        /// <summary>
        /// 夜间SO2 损失率 percent/hour（百分比/小时）
        /// </summary>
        double m_RNITE1 = 0.2;

        public double RNITE1
        {
            get { return m_RNITE1; }
            set { m_RNITE1 = value; }
        }

        /// <summary>
        /// 夜间NOx损失率百分比/小时percent/hour
        /// </summary>
        double m_RNITE2 = 2.0;

        public double RNITE2
        {
            get { return m_RNITE2; }
            set { m_RNITE2 = value; }
        }

        /// <summary>
        /// 夜间HNO3 产生率百分比/小时percent/hour
        /// </summary>
        double m_RNITE3 = 2.0;

        public double RNITE3
        {
            get { return m_RNITE3; }
            set { m_RNITE3 = value; }
        }


        /// <summary>
        /// H2O2 data
        /// =0，使用月平均背景H2O2浓度
        /// =1.读取小时数据文件H2O2.dat
        /// </summary>
        int m_MH2O2 = 1;

        public int MH2O2
        {
            get { return m_MH2O2; }
            set { m_MH2O2 = value; }
        }

        /// <summary>
        /// 臭氧浓度，单位PPb，
        /// 定义每月臭氧浓度值，共12个
        /// </summary>
        List<double> m_BCKH2O2;

        public List<double> BCKH2O2
        {
            get { return m_BCKH2O2; }
            set { m_BCKH2O2 = value; }
        }


        /// <summary>
        /// 二次有机气溶胶选项
        /// 只在MCHEM=4用到
        /// </summary>
        SOAData m_SOA;
        /// <summary>
        /// 二次有机气溶胶选项
        /// 只在MCHEM=4用到
        /// </summary>
        public SOAData SOA
        {
            get { return m_SOA; }
            set { m_SOA = value; }
        }

        public override string WriteToGroup()
        {
            string Subgroup = "", TempStr;

            TempStr = StrWriter.GetCLine();
            TempStr += "INPUT GROUP: 11 -- Chemistry Parameters" + "\r\n";
            Subgroup += TempStr;

            TempStr = StrWriter.GetCLine();
            Subgroup += TempStr;

            TempStr = "! MOZ = " + MOZ.ToString() + " !" + "\r\n";
            Subgroup += TempStr;

            if (BCKO3.Count > 0)
            {
                TempStr = "!  BCKO3  =    ";
                for (int i = 0; i < BCKO3.Count; i++)
                {
                    if (i == BCKO3.Count - 1)
                    {
                        TempStr += BCKO3[i].ToString();
                    }
                    else
                    {
                        TempStr += BCKO3[i].ToString() + ",   ";
                    }


                }
                TempStr += "    ! " + "\r\n";
                Subgroup += TempStr;
            }



            if (BCKNH3.Count > 0)
            {
                TempStr = "!  BCKNH3  =    ";
                for (int i = 0; i < BCKNH3.Count; i++)
                {
                    if (i == BCKNH3.Count - 1)
                    {
                        TempStr += BCKNH3[i].ToString();
                    }
                    else
                    {
                        TempStr += BCKNH3[i].ToString() + ",   ";
                    }


                }
                TempStr += "    ! " + "\r\n";
                Subgroup += TempStr;
            }


            TempStr = "! RNITE1 = " + RNITE1.ToString() + " !" + "\r\n";
            Subgroup += TempStr;

            TempStr = "! RNITE2 = " + RNITE2.ToString() + " !" + "\r\n";
            Subgroup += TempStr;

            TempStr = "! RNITE3 = " + RNITE3.ToString() + " !" + "\r\n";
            Subgroup += TempStr;

            TempStr = "! MH2O2 = " + MH2O2.ToString() + " !" + "\r\n";
            Subgroup += TempStr;


            if (BCKH2O2.Count > 0)
            {
                TempStr = "!  BCKH2O2  =    ";
                for (int i = 0; i < BCKH2O2.Count; i++)
                {
                    if (i == BCKH2O2.Count - 1)
                    {
                        TempStr += BCKH2O2[i].ToString();
                    }
                    else
                    {
                        TempStr += BCKH2O2[i].ToString() + ",   ";
                    }


                }
                TempStr += "    ! " + "\r\n";
                Subgroup += TempStr;
            }


            if (this.SOA.m_BCKPMF.Count > 0)
            {
                TempStr = "!  BCKPMF   =    ";
                for (int i = 0; i < this.SOA.m_BCKPMF.Count; i++)
                {
                    if (i == this.SOA.m_BCKPMF.Count - 1)
                    {
                        TempStr += this.SOA.m_BCKPMF[i].ToString();
                    }
                    else
                    {
                        TempStr += this.SOA.m_BCKPMF[i].ToString() + ",   ";
                    }


                }
                TempStr += "    ! " + "\r\n";
                Subgroup += TempStr;
            }

            if (this.SOA.m_OFRAC.Count > 0)
            {
                TempStr = "!  OFRAC   =    ";
                for (int i = 0; i < this.SOA.m_OFRAC.Count; i++)
                {
                    if (i == this.SOA.m_OFRAC.Count - 1)
                    {
                        TempStr += this.SOA.m_OFRAC[i].ToString();
                    }
                    else
                    {
                        TempStr += this.SOA.m_OFRAC[i].ToString() + ",   ";
                    }


                }
                TempStr += "    ! " + "\r\n";
                Subgroup += TempStr;
            }

            if (this.SOA.m_VCNX.Count > 0)
            {
                TempStr = "!  VCNX   =    ";
                for (int i = 0; i < this.SOA.m_VCNX.Count; i++)
                {
                    if (i == this.SOA.m_VCNX.Count - 1)
                    {
                        TempStr += this.SOA.m_VCNX[i].ToString();
                    }
                    else
                    {
                        TempStr += this.SOA.m_VCNX[i].ToString() + ",   ";
                    }


                }
                TempStr += "    ! " + "\r\n";
                Subgroup += TempStr;
            }

            Subgroup += "! END !" + "\r\n";
            return Subgroup;
        }


        public override void ReadFromGroup(Dictionary<string, string> dic)
        {
            foreach (KeyValuePair<string, string> m_dic in dic)
            {
                if (m_dic.Key == "MOZ")
                {
                    this.MOZ = Convert.ToInt32(m_dic.Value);
                }
                if (m_dic.Key == "BCKO3")
                {
                    this.BCKO3 = StrWriter.ReturnDouList(m_dic.Value);
                }
                if (m_dic.Key == "BCKNH3")
                {
                    this.BCKNH3 = StrWriter.ReturnDouList(m_dic.Value);
                }
                if (m_dic.Key == "RNITE1")
                {
                    this.RNITE1 = Convert.ToDouble(m_dic.Value);
                }
                if (m_dic.Key == "RNITE2")
                {
                    this.RNITE2 = Convert.ToDouble(m_dic.Value);
                }
                if (m_dic.Key == "RNITE3")
                {
                    this.RNITE3 = Convert.ToDouble(m_dic.Value);
                }
                if (m_dic.Key == "MH2O2")
                {
                    this.MH2O2 = Convert.ToInt32(m_dic.Value);
                }
                if (m_dic.Key == "BCKH202")
                {
                    this.BCKH2O2 = StrWriter.ReturnDouList(m_dic.Value);
                }


            }
        }




    }

    /// <summary>
    /// 二次有机气溶胶选项只在MCHEM=4用到
    /// </summary>
    [Serializable]
    public class SOAData
    {

        public SOAData()
        {


            m_BCKPMF = new List<double> { 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00 };
            m_OFRAC = new List<double> { 0.15, 0.15, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.15 };
            m_VCNX = new List<double> { 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00 };

        }
        /// <summary>
        /// 细粒子浓度  ug/m^3可能是PM2.5
        /// </summary>
        public List<double> m_BCKPMF;
        /// <summary>
        ///细粒子中的有机馏分 
        /// </summary>
        public List<double> m_OFRAC;
        /// <summary>
        /// VOC / NOX 比率 (after reaction)
        /// </summary>
        public List<double> m_VCNX;

        public void CleanContinental()
        {
            m_BCKPMF.Clear();
            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);

            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);

            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);
            m_BCKPMF.Add(1);

            m_OFRAC.Clear();
            m_OFRAC.Add(0.15);
            m_OFRAC.Add(0.15);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);

            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);

            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.15);

            m_VCNX.Clear();
            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);

            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);

            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);
        }
        public void CleanMarine()
        {
            m_BCKPMF.Clear();
            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);

            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);

            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);
            m_BCKPMF.Add(0.5);

            m_OFRAC.Clear();
            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);

            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);

            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.25);

            m_VCNX.Clear();
            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);

            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);

            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);
            m_VCNX.Add(50);
        }
        public void UrbanLow()
        {
            m_BCKPMF.Clear();
            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);

            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);

            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);
            m_BCKPMF.Add(30);

            m_OFRAC.Clear();
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.25);

            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.25);

            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);

            m_VCNX.Clear();
            m_VCNX.Add(4);
            m_VCNX.Add(4);
            m_VCNX.Add(4);
            m_VCNX.Add(4);

            m_VCNX.Add(4);
            m_VCNX.Add(4);
            m_VCNX.Add(4);
            m_VCNX.Add(4);

            m_VCNX.Add(4);
            m_VCNX.Add(4);
            m_VCNX.Add(4);
            m_VCNX.Add(4);
        }
        public void UrbanHigh()
        {
            m_BCKPMF.Clear();
            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);

            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);

            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);
            m_BCKPMF.Add(60);

            m_OFRAC.Clear();
            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);

            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.55);
            m_OFRAC.Add(0.55);
            m_OFRAC.Add(0.55);

            m_OFRAC.Add(0.35);
            m_OFRAC.Add(0.35);
            m_OFRAC.Add(0.35);
            m_OFRAC.Add(0.25);

            m_VCNX.Clear();
            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);

            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);

            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);
        }
        public void RegionalPlume()
        {
            m_BCKPMF.Clear();
            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);

            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);

            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);
            m_BCKPMF.Add(20);

            m_OFRAC.Clear();
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.2);
            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.35);

            m_OFRAC.Add(0.25);
            m_OFRAC.Add(0.4);
            m_OFRAC.Add(0.4);
            m_OFRAC.Add(0.4);

            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.2);

            m_VCNX.Clear();
            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);

            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);

            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);
            m_VCNX.Add(15);
        }
        public void UrbanNo()
        {
            m_BCKPMF.Clear();
            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);

            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);

            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);
            m_BCKPMF.Add(100);

            m_OFRAC.Clear();
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.3);
            m_OFRAC.Add(0.35);
            m_OFRAC.Add(0.35);

            m_OFRAC.Add(0.35);
            m_OFRAC.Add(0.55);
            m_OFRAC.Add(0.55);
            m_OFRAC.Add(0.55);

            m_OFRAC.Add(0.35);
            m_OFRAC.Add(0.35);
            m_OFRAC.Add(0.35);
            m_OFRAC.Add(0.3);

            m_VCNX.Clear();
            m_VCNX.Add(2);
            m_VCNX.Add(2);
            m_VCNX.Add(2);
            m_VCNX.Add(2);

            m_VCNX.Add(2);
            m_VCNX.Add(2);
            m_VCNX.Add(2);
            m_VCNX.Add(2);

            m_VCNX.Add(2);
            m_VCNX.Add(2);
            m_VCNX.Add(2);
            m_VCNX.Add(2);
        }



    }


}
